
// Node.js 的 Buffer 类是一个用于处理原始二进制数据的全局对象。
//它常用于处理 TCP 流、文件系统操作和 HTTP 请求/响应中的二进制数据。
//以下是 Buffer 类的一些常用用法及示例。

//在 Node.js 中，可以通过多种方式创建 Buffer 实例：

//通过 Buffer.alloc(size[, fill[, encoding]])：创建一个指定大小的 Buffer，并可选地用指定的值（默认为 0）来填充。

var buffer1 = Buffer.alloc(5);// 创建一个 5 字节的 Buffer，并用 0 填充。
console.log(buffer1); // <Buffer 00 00 00 00 00>
console.log(buffer1.toString())

var buffer2 = Buffer.alloc(5, 'a');
console.log(buffer2); // <Buffer 61 61 61 61 61>
console.log(buffer2.toString())

var buffer3 = Buffer.alloc(5, 'a', 'utf8');
//utf8 编码 一个中文字符占用 3 个字节，一个英文字符占用 1 个字节
console.log(buffer3); // <Buffer 61 61 61 61 61>    

var buffer4 = Buffer.alloc(6, '中', 'utf8');
console.log(buffer4); // <Buffer e4 b8 ad e6 96 87 e4 b8 ad e6 96 87>
console.log(buffer4.toString('utf8')); 

var buffer5 = Buffer.alloc(6, '中', 'ascii');
// ascii 编码 一个中文字符占用 2 个字节，一个英文字符占用 1 个字节
console.log(buffer5); // <Buffer d6 d0 b9 d6 d0 b9>
console.log(buffer5.toString('ascii'));   



//通过 Buffer.allocUnsafe(size)：创建一个指定大小的 Buffer，但它不会初始化内存区域（即可能包含敏感数据）。使用时需要小心。
//通过 Buffer.allocUnsafeSlow(size)：与 Buffer.allocUnsafe() 类似，但会尝试避免使用 Node.js 的内部 Buffer 池，可能更慢。
//通过 Buffer.from(array)：根据传入的数组（如 Uint8Array）创建一个新的 Buffer 实例。
//通过 Buffer.from(string[, encoding])：根据传入的字符串和编码（默认为 'utf8'）创建一个新的 Buffer 实例。

var buf = Buffer.from('你好，nodejs');
console.log(buf); // <Buffer e4 bd a0 e5 a5 bd ef bc 8c 6e 6f 64 65 73 6f 6e>
buf = Buffer.from('你好，nodejs', 'utf8');
console.log(buf); // <Buffer e4 bd a0 e5 a5 bd ef bc 8c 6e 6f 64 65 73 6f 6e>
buf = Buffer.from('你好，nodejs', 'ascii');
console.log(buf); // <Buffer e4 bd a0 e5 a5 bd ef bc 8c 6e 6f 64 65 73 6f 6e>
console.log(buf.toString('utf8')); // 
console.log(buf.toString('ascii')); // 你好，nodejs


const strWithNonAscii = 'Hello, 世界!';  
  
// 尝试使用ASCII编码（这通常不是一个好主意）  
const bufNonAscii = Buffer.from(strWithNonAscii, 'ascii');  
  
// 注意：这将不会正确转换非ASCII字符，并可能导致意外的输出  
console.log(bufNonAscii.toString('ascii')); // 输出可能是乱码，或者仅包含ASCII字符的部分  
  
// 正确的做法是使用UTF-8编码  
const bufUtf8 = Buffer.from(strWithNonAscii, 'utf8');  
console.log(bufUtf8.toString('utf8')); // 输出: Hello, 世界!



//通过 Buffer.of(array)：与 Buffer.from(array) 类似，但会返回一个共享同一内存的 Buffer 实例。
//通过 Buffer.from(buffer)：复制传入的 Buffer 实例的数据，创建一个新的 Buffer 实例。
//通过 Buffer.from(arrayBuffer[, byteOffset[, length]])：根据传入的 ArrayBuffer、可选的字节偏移量和长度创建一个新的 Buffer 实例。

//Buffer 属性与方法
//以下是 Buffer 类的一些常用属性和方法。

//属性
//Buffer.poolSize：返回 Node.js 的 Buffer 实例池的大小。
//实例属性
//实例属性包括：
//buf.length：返回 Buffer 实例的长度。
//buf.parent：如果 Buffer 实例是子 Buffer，则返回它的父 Buffer。
//buf.offset：如果 Buffer 实例是子 Buffer，则返回子 Buffer 在父 Buffer 中的偏移量。
//方法
//方法包括：
//buf.compare(otherBuffer)：比较两个 Buffer 实例的大小。
//buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])：从源 Buffer 实例拷贝数据到目标 Buffer 实例。
//buf.entries()：返回一个迭代器，该迭代器包含 [index, byte] 数组。
//buf.equals(otherBuffer)：比较两个 Buffer 实例是否相等。
//buf.fill(value[, offset[, end]])：用指定的值填充 Buffer 实例的指定区域。
//buf.includes(value[, byteOffset])：检查 Buffer 实例是否包含指定的值。
//buf.indexOf(value[, byteOffset])：返回 Buffer 实例中第一个出现指定值的索引。
//buf.keys()：返回一个迭代器，该迭代器包含 Buffer 实例的索引。
//buf.lastIndexOf(value[, byteOffset])：返回 Buffer 实例中最后一个出现指定值的索引。
//buf.readDoubleBE([offset])：从 Buffer 实例的指定位置读取一个双精度浮点数（高位字节序）。
//buf.readDoubleLE([offset])：从 Buffer 实例的指定位置读取一个双精度浮点数（低位字节序）。
//buf.readFloatBE([offset])：从 Buffer 实例的指定位置读取一个单精度浮点数（高位字节序）。
//buf.readFloatLE([offset])：从 Buffer 实例的指定位置读取一个单精度浮点数（低位字节序）。
//buf.readInt8([offset])：从 Buffer 实例的指定位置读取一个 8 位有符号整数。
//buf.readInt16BE([offset])：从 Buffer 实例的指定位置读取一个 16 位有符号整数（高位字节序）。
//buf.readInt16LE([offset])：从 Buffer 实例的指定位置读取一个 16 位有符号整数（低位字节序）。
//buf.readInt32BE([offset])：从 Buffer 实例的指定位置读取一个 32 位有符号整数（高位字节序）。
//buf.readInt32LE([offset])：从 Buffer 实例的指定位置读取一个 32 位有符号整数（低位字节序）。           